/**
 * 计算 table 列内容不换行的情况,列的宽度
 * @param tableDataList 表格数据
 * @param name 列名称
 * @param flag 匹配模式,可选 equal 或 max, equal 代表列宽适配该列中第一行内容, max 代表列宽适配该列中最长的内容
 * @param minWidth 列宽最小值
 * @param maxWidth 列宽最大值
 */
export const calculateTableColumnNoWrapWidth = (
  tableDataList: ITableDataItem[],
  name: string,
  flag: 'max' | 'equal' = 'max',
  minWidth: number = 80,
  maxWidth?: number
): number => {
  if (tableDataList.length === 0) {
    return minWidth
  }

  let maxColumnContent = ''

  for (let i = 0; i < tableDataList.length; i++) {
    const contentResult = splicingCharacterRecursion(tableDataList[i], name)

    if (flag === 'max') {
      if (contentResult.length > maxColumnContent.length) {
        maxColumnContent = contentResult
      }
    } else {
      maxColumnContent = contentResult
      break
    }
  }

  let dynamicWidth = 0
  for (const char of maxColumnContent) {
    // 如果是英文字符,为字符分配 8 个单位宽度
    if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {
      dynamicWidth += 8
    } else if (char >= '\u4e00' && char <= '\u9fa5') {
      // 如果是中文字符,为字符分配 15 个单位宽度
      dynamicWidth += 15
    } else {
      // 其他种类字符,为字符分配 8 个单位宽度
      dynamicWidth += 8
    }
  }

  // 范围判定
  if (dynamicWidth < minWidth) {
    dynamicWidth = minWidth
  } else if (maxWidth && dynamicWidth > maxWidth) {
    dynamicWidth = maxWidth
  }

  // 额外边距
  return (dynamicWidth += 40)
}

/**
 * 获取对象中,指定属性的值,若为普通数据类型则转为字符串,若为对象类型则拼接对象中的所有属性
 * @param sourceObj 指定对象
 * @param key  指定属性
 * @result result  计算后的结果
 */
function splicingCharacterRecursion(sourceObj: any, key: string, result = '') {
  if (sourceObj && key) {
    const value = sourceObj[key]
    if (value) {
      // 如果为普通数据类型
      if (typeof value !== 'object' && String(value).length > 0) {
        result += String(value)
      } else if (typeof value === 'object') {
        // 对象类型为内部所有属性长度和
        for (const key in value) {
          result = splicingCharacterRecursion(value, key, result)
        }
      }
    }
  }
  return result
}

/**
 * 将文件 / 文件夹路径,转化为 table 数据
 *    如果 flag 为 file, paths 中若存在目录,则读取目录下所有文件
 *    如果 flag 为 folder, paths 中若存在文件,则忽略
 */
export const convertPathsToTableData = (
  pathList: string[],
  flag: 'file' | 'folder'
): Promise<ITableDataItem[]> => {
  return window.api.convertPathsToTableData(pathList, flag)
}
